package com.decheng.config;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration;

/**
 * @Author 孔德成
 * @Slogan 致敬大师，致敬未来的你
 * @date 2021/7/3
 * @desc 配置 DispatchServlet
 */
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }


    @Override
    protected Filter[] getServletFilters() {
        return new Filter[]{
                new CharacterEncodingFilter("UTF-8", true)
        };
    }

    /**
     * 自定义 DispatcherServlet
     *
     * @param registration
     */
    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        // 配置 MultipartResolver
        // Optionally also set maxFileSize, maxRequestSize, fileSizeThreshold
        // location – 文件将被临时存储的目录位置(磁盘绝对路径)
        // maxFileSize – 上传文件的最大容量(以字节为单位)。默认是没有限制的。
        // maxRequestSize – 整个multipart请求的最大容量(以字节为单位)，不会关心有多 少个part以及每个part的大小。默认是没有限制的。
        // fileSizeThreshold – 文件将被写入磁盘的大小阈值(在上传的过程中，如果文件大小达到了一个指定最大容量(以字节为单位)，将会写入到临时文件路径中。默认值为0，也就是 所有上传的文件都会写入到磁盘上。)

        // 假设我们想限制文件的大小不超过2MB，整个请求不超过 4MB，而且所有的文件都要写到磁盘中。
        registration.setMultipartConfig(
                new MultipartConfigElement(
                        "/Users/codemao/tmp/demo02/uploads",
                        2097152,
                        4194304,
                        0));

    }
}
